﻿/********************************************************************************
** @ Date:2024/04/23
** @ Author: AoZhiQiang
** @ Description: 信息交互线程基类
** @ Version:1.0.0
** @ Fun:
********************************************************************************/
#ifndef CInfoExchangeBase_H
#define CInfoExchangeBase_H
#include <QObject>
#include <QRunnable>
#include <QQueue>
#include <QMutex>

//接收数据参数结构体
struct SReqDataParam
{
	QString sReqGuid;      //需要控制的设备编号/场景guid
	QString sSceneType;	   //请求场景类型:rob机器人 sensor声振温
	int nCmd;              //指令编码，如1000代表关注
	QString sParam;        //扩充参数  如 param:{ip:”127.0.0.1”, triggerMode:0}, 其中triggerMode触发方式，0：单点式  1:长按式
	int nReqType;          //0：控制协议 1：报文推送协议，
	int nReqWay;		   //0:设备相关  1:场景相关
	QString sSendTime;     //发送时间
	SReqDataParam()
	{
		sReqGuid = "";
		sSceneType = "";
		nCmd = 0;
		sParam = "";
		nReqType = 0;
		nReqWay = 0;
		sSendTime = "";
	}
};

//响应数据参数结构体
struct SRspDataParam
{
	QString sRspGuid;      //响应的设备编号 和 接收的需要一制
	QString sSceneType;	   //请求场景类型:rob机器人 sensor声振温
	int nCmd;              //指令编码，如1000代表关注
	int nStatus;           //结果状态编码 成功：200；服务异常：400；其他:500
	QString sMsg;          //结果描述
	int nRspType;          //0：控制协议 1：报文推送协议
	int nRspWay;           //0：设备 1：场景
	QString sRspParam;     //结果参数 Json对象或数组
	QString sRspime;       //响应时间
	SRspDataParam()
	{
		sRspGuid = "";
		sSceneType = "";
		nCmd = 0;
		nCmd = 500;
		sMsg = "";
		nRspType = 0;
		nRspWay = 0;
		sRspParam = "";
		sRspime = "";
	}
};

//协议类型枚举
enum EProtType
{
	enCtrProt,             //控制协议
	enMsgProt              //报文推送协议
};

class CInfoExchangeBase : public QObject, public QRunnable
{
	Q_OBJECT

public:
	explicit CInfoExchangeBase(QObject *parent = nullptr);
	~CInfoExchangeBase();

	virtual void run();                                                                //线程工作方法
	virtual void getReqString(QString sReqString, SReqDataParam& stParam);             //获取请求数据
	virtual void addReqToQueue(SReqDataParam stParam);                                 //添加接收消息到队列中
	virtual void analyzeReqStringToQueue(QString sReqString);                          //解析响应信息添加接收消息到队列中
	//创建响应数据
	virtual void createRspMsg(SRspDataParam& stRspParam, SReqDataParam stReqParam, int nSatus, QString sMsg, QString sRspParam);
	//创建响应数据字符串
	virtual void createRspMsgString(SRspDataParam stRspParam, QString& sRspParamString);

protected:
	virtual void initData();
	virtual void handleReqQueue();							    //处理请求队列
	virtual void analyzeReqData(SReqDataParam stParam);			//解析请求信息
	virtual void handleCtrProt(SReqDataParam stParam) {};		//处理控制协议
	virtual void handleMsgProt(SReqDataParam stParam) {};		//处理报文推送协议
	virtual void handleMsgDevice(SReqDataParam stParam) {};		//处理设备报文推送协议
	virtual void handleMsgScene(SReqDataParam stParam) {};		//处理场景报文推送协议

public slots:
	void slotAddReqToQueue(SReqDataParam stParam);              //添加接收消息到队列中
	void slotAnalyzeReqStringToQueue(QString sReqString);       //解析响应信息添加接收消息到队列中

signals:
	void sigAddReqToQueue(SReqDataParam stParam);               //添加接收消息到队列中(信号)
	void sigAnalyzeReqStringToQueue(QString sReqString);        //解析响应信息添加接收消息到队列中(信号)
	void sigSendRspMsg(SRspDataParam stRspData);                //发送响应数据
	void sigSendRspMsgString(QString sRspMsgString);            //发送响应数据字符串

public:
	QString m_sCtrIp;                                           //控制的IP

protected:
	bool m_bIsStop;                                             //是否停止
	QQueue<SReqDataParam> m_qReqQueue;                          //接收指令队列
	QMutex m_locker;                                            //锁
};

#endif 